RV64IMA_zifencei_zicsr
我們先來盤點一下總共要實作的指令有哪些,以及指令的格式有哪些。
在那之前推薦兩個好用的網站,在後續實作時幫助很大,分別為
切回正題,我們的目標是要能開沒有FPU(浮點數),沒有MMU的Linux,根據mini-rv32,我們只要實現IMA指令就可以將Linux開起來,但實際上還需要再額外實現zifence.i及zicsr這兩個擴充。
而RISCV-I指令又可以簡單區分為 ALU指令(運算類),CTRL指令(控制指令流程),LS指令(load and store,記憶體相關),以及其他(enviroment call......),我們統計RVI在32bit下ALU有21道指令,分別為。
指令 | 行為 |
---|---|
lui(load upper immediate) |
讀取立即值到暫存內。 |
auipc(add upper immediate to pc) |
讀取一個立即值,加上PC後存回暫存內。 |
add |
將暫存內的值相加後存回暫存內。 |
addi |
將暫存內的值加上一個立即值後存回暫存內。 |
sub |
將暫存內的值相減後存回暫存內。 |
and |
將暫存內的值做邏輯"與"運算後存回暫存內。 |
andi |
將暫存內的值與一個立即值做邏輯"與"運算後存回暫存內。 |
or |
將暫存內的值做邏輯"或"運算後存回暫存內。 |
ori |
將暫存內的值與一個立即值做邏輯"或"運算後存回暫存內。 |
xor |
將暫存內的值做邏輯"互斥或"運算後存回暫存內。 |
xori |
將暫存內的值與一個立即值做邏輯"互斥或"運算後存回暫存內。 |
sll(shift left logic) |
將暫存內的值邏輯左移後存回暫存內。 |
slli(shift left logic immediate) |
將暫存內的值邏輯左移一個立即值後存回暫存內。 |
srl(shift right logic) |
將暫存內的值邏輯右移後存回暫存內。 |
srli(shift right logic immediate) |
將暫存內的值邏輯右移一個立即值後存回暫存內。 |
sra (shift right arithmetic) |
將暫存內的值算數右移後存回暫存內。 |
srai (shift right arithmetic immediate) |
將暫存內的值算數右移一個立即值後存回暫存內。 |
slt(set less than) |
如果暫存A比暫存B小(有號),則設另一暫存為1,反之則設為0。 |
slti(set less than immediate) |
如果暫存A比立即值小,則設另一暫存為1,反之則設為0。 |
sltu(set less than unsigned) |
如果暫存A比暫存B小(無號),則設另一暫存為1,反之則設為0。 |
sltiu(set less than unsigned immediate) |
如果暫存A比立即值小(無號),則設另一暫存為1,反之則設為0。 |
而64bit則會需要額外支援以下9道指令,皆為64bit下要額外支援以32bit為單位進行操作下的指令。
指令 | 行為 |
---|---|
addw |
將暫存內的值相加後,以word(32bit)為單位存回暫存內。 |
subw |
將暫存內的值相減後,以word(32bit)為單位存回暫存內。 |
addiw |
將暫存內的值加上一個立即值後,以word(32bit)為單位存回暫存內。 |
sllw |
將暫存內的值邏輯左移後,以word(32bit)為單位存回暫存內。 |
slliw |
將暫存內的值邏輯左移後,以word(32bit)為單位存回暫存內。 |
srlw |
將暫存內的值邏輯右移後,以word(32bit)為單位存回暫存內。 |
srliw |
將暫存內的值邏輯右移後,以word(32bit)為單位存回暫存內。 |
sraw |
將暫存內的值算數右移後,以word(32bit)為單位存回暫存內。 |
sraiw |
將暫存內的值算數右移一個立即值後,以word(32bit)為單位存回暫存內。 |
我們可以發現,很多指令的行為是類似的,例如add和addi,區別只是在一個是以暫存內的值相加,另一個是加上立即值。實際上根據行為不同其對應的編碼也會有所不同,例如說要加上立即值的指令,會需要保留較大的空間給立即值使用,而以暫存去儲存值只要有足夠的位元數去儲存暫存器的編號即可,根據這些特點不同,RISC-V指令可簡單分為以下幾種編碼格式。
其中R和I分別對應上述的add, addi等以暫存或以立即值作為輸入的指令,U指的是lui,auipc等需要較多空間儲存立即值的指令,S是store指令的格式,B跟J則是CTRL指令的Branch以及Jump等指令的格式,可以先簡單記憶一下。接下來的兩天會將上述提到的ALU分為R-format及I-format,將這些指令完成,並再花三天將I extension內還未介紹的CTRL指令(控制指令流程),LS指令(load and store,記憶體相關),以及其他指令介紹並實作。
碎碎念 : 想說簡單介紹一下I extension的指令,結果不小心就篇幅太長了。接下來會是比較密集的實作,希望能盡量減少這樣長篇幅都是字的內容。